package com.my.springboot.tuling.jvm.gc;

import com.my.springboot.tuling.jvm.bean.User;

/**
 * 1.例子在jdk1.8下示例栈上分配内存的例子；
 * 2.切记一定要run，不能在debug模式下运行！！！
 * 3.jdk7之后默认开启:-XX:+DoEscapeAnalysis 开启逃逸分析；-XX:+EliminateAllocations 开启标量替换（“+”为开启，“-”为关闭）
 *  -XX:+PrintGCDetails 打印GC的详细信息  -XX:+PrintG，等同于-verbose:gc 表示打开简化的GC日志
 * 4.逃逸分析和标量替换参数需要同时开启，才可以栈上分配
 * 5.设置堆最大内存：‐Xmx15m  堆最小：‐Xms15m； ‐Xmn15m  新生代
 *
 * 说明：栈上分配，标量替换
 * 代码调用了1亿次alloc()，如果是分配到堆上，大概需要1GB以上堆空间，如果堆空间小于该值，必然会触发GC。
 *
 * 使用如下参数不会发生GC
 * -Xmx15m -Xms15m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:+EliminateAllocations
 * 使用如下参数都会发生大量GC
 * -Xmx15m -Xms15m -XX:-DoEscapeAnalysis -XX:+PrintGC -XX:+EliminateAllocations
 * -Xmx15m -Xms15m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-EliminateAllocations
 */

public class AllotOnStack {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            alloc();
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start);

    }

    private static void alloc() {
        User user = new User();
        user.setId(1);
        user.setName("zhuge");
    }
}
